# -*- coding: utf-8 -*-
# @Time    : 2024/7/30 16:50
# @Author  : yujiahao
# @File    : 72_fastapi_start_close.py
# @description:事件：启动 - 关闭

# FastAPI 支持定义在应用启动前，或应用关闭后执行的事件处理器（函数）。
# 事件函数既可以声明为异步函数（async def），也可以声明为普通函数（def）。
# 注意：FastAPI 只执行主应用中的事件处理器，不执行子应用 - 挂载中的事件处理器。


# todo startup 事件

# 使用 startup 事件声明 app 启动前运行的函数


from fastapi import FastAPI

app = FastAPI()

items = {}


# todo 使用 startup 事件声明 app 启动前运行的函数
# 只有所有 startup 事件处理器运行完毕，FastAPI 应用才开始接收请求。
@app.on_event("startup")
async def startup_event():
    items["foo"] = {"name": "Fighters"}
    items["bar"] = {"name": "Tenders"}


@app.get("/items/{item_id}")
async def read_items(item_id: str):
    return items[item_id]


# todo shutdown 事件
# 使用 shutdown 事件声明 app 关闭时运行的函数
output_path = '../../../output/fastapi_shutdown.txt'


# shutdown 事件处理器函数在整个应用结束的时候（不是调用某个API），会在目标文件中追加一行文本 Application shutdown
@app.on_event("shutdown")
def shutdown_event():
    """
    注意，本例使用 Python open() 标准函数与文件交互。

    这个函数执行 I/O（输入/输出）操作，需要等待内容写进磁盘。

    但 open() 函数不支持使用 async 与 await。

    因此，声明事件处理函数要使用 def，不能使用 async def。
    """

    with open(output_path, mode="a") as log:
        log.write("Application shutdown")


@app.get("/items/")
async def read_items():
    return [{"name": "Foo"}]
